"""
Case Type   : 资源池化
Case Name   : 备机注入cma故障，缩容备机
Create At   : 2024.10
Owner       : chen
Description :
    1.备二注入cma故障
    cd $GAUSSHOME/bin
    mv cm_agment cm_agment1
    kill -9 pid(cm_agment)
    2.缩容备二
    gs_dropnode -U USER -G GROUP -h hostlist
    3.恢复故障
    cd $GAUSSHOME/bin
    mv cm_agment1 cm_agment
    cm_ctl start -n 3
Expect      :
    1.成功
    2.合理报错
    3.恢复成功
"""

import os
import time
import unittest
from testcase.utils.Logger import Logger
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Common import Common
from testcase.utils.Constant import Constant
from yat.test import Node
from yat.test import macro

class SharedStorage(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'-----{os.path.basename(__file__)} start-----')
        self.pri_comsh = CommonSH('PrimaryDbUser')
        self.com = Common()
        self.constant = Constant()
        self.pri_node = Node('PrimaryDbUser')
        self.pri_root_node = Node('PrimaryRoot')
        self.sta2_node = Node('Standby2DbUser')
        self.db_host = self.sta2_node.db_host
        self.s_user = self.pri_node.ssh_user

    def test_shared_storage(self):
        text = f'''-----step1: 备二注入cma故障 expect: 成功-----'''
        self.log.info(text)
        pid = self.com.get_pid(self.sta2_node, 'bin/cm_agent')
        cmd = f'''source {macro.DB_ENV_PATH}; \
            mv $GAUSSHOME/bin/cm_agent $GAUSSHOME/bin/cm_agent_bak'''
        self.log.info(cmd)
        res = self.sta2_node.sh(cmd).result()
        self.log.info(res)
        cmd = f'''kill -9 {pid}'''
        self.log.info(cmd)
        res = self.sta2_node.sh(cmd).result()
        self.log.info(res)
        time.sleep(5)

        text = f'''-----step2: 缩容备二 expect: 合理报错-----'''
        self.log.info(text)
        cmd = f'''source {macro.DB_ENV_PATH};
        expect <<EOF
        set timeout 600
        spawn gs_dropnode -U {self.s_user} -G {self.s_user} \
            -h {self.db_host}
        expect "*drop the target node (yes/no)?*"
        send "yes\\n"
        expect eof\n''' + '''EOF'''
        self.log.info(cmd)
        res = self.pri_node.sh(cmd).result()
        self.log.info(res)
        self.assertIn('Success to drop the target nodes', res)
        cmd = f'source {macro.DB_ENV_PATH}; gs_uninstall --delete-data'
        self.log.info(cmd)
        res = self.sta2_node.sh(cmd).result()
        self.log.info(res)
        self.assertIn('Uninstallation succeeded', res)

    def tearDown(self):
        text = f'''-----step3: 恢复环境 expect: 成功-----'''
        self.log.info(text)
        xml_path = macro.DB_XML_PATH
        cmd = f'''gs_expansion -U {self.s_user} -G \
            {self.s_user} -X {xml_path} -h {self.db_host}'''
        execute_cmd = f'''source {macro.DB_ENV_PATH};
        expect <<EOF
        set timeout 300
        spawn {cmd}
        expect "*assword*:"
        send "{self.pri_root_node.ssh_password}\\n"
        expect "*assword*:"
        send "{self.pri_root_node.ssh_password}\\n"
        expect "*lease repeat for database*:"
        send "{macro.GAUSSDB_INIT_USER_PASSWD}\\n"
        expect eof\n''' + '''EOF'''
        self.log.info(execute_cmd)
        res = self.pri_root_node.sh(execute_cmd).result()
        self.log.info(res)
        self.assertIn(f'{self.db_host}:\tSuccess', res)
        self.log.info(f'-----{os.path.basename(__file__)} end-----')